home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
MACD 5
/
MACD 5.bin
/
workbench
/
boot
/
czesc_2
/
tlpatch
/
source
/
tlpatch.c
< prev
next >
Wrap
C/C++ Source or Header
|
1991-05-09
|
6KB
|
258 lines
/* TLPatch.c V1.0 */
/* Translator.library patch utility */
/* Richard Sheppard - Jan. 7, 1991 */
/* Toronto, Canada */
#include <exec/types.h>
#include <stdio.h>
#include <exec/execbase.h>
#include <exec/nodes.h>
char line[256]; /* line buffer */
LONG codesize; /* size of code & xtbl hunk */
LONG jmptab[28]; /* jump table array */
FILE *fp1, *fp2; /* input file (exception table), outfile */
FILE *fp3; /* input file (translator.library) */
WORD code[969]; /* original code at start */
LONG reloc[38] = /* reloc table at end of file */
{
0x000003EC, 0x00000004, 0x00000000, 0x000000F4,
0x000000F0, 0x000000EC, 0x000000E8, 0x00000012,
0x00000000, 0x0000063E, 0x0000063A, 0x00000636,
0x00000632, 0x0000062E, 0x0000062A, 0x00000626,
0x00000622, 0x0000061E, 0x0000061A, 0x00000616,
0x00000612, 0x0000060E, 0x000005D6, 0x000003B2,
0x0000039A, 0x000001EE, 0x00000176, 0x00000001,
0x00000000, 0x000000F8, 0x00000001, 0x00000000,
0x000000C8, 0x00000000, 0x000003F2, 0x000003E9,
0x00000000, 0x000003F2
};
struct ExecBase *ExecBase = NULL;
struct Node *node;
void main(),AddFile(),Validate(),Extract();
int GetLine(char line[], int max);
int GetExcept(char line[], int max);
int StrIndex(char source[], char searchfor[]);
char pattern[] = "[A"; /* 1st search pattern */
void
main(argc,argv)
int argc;
char *argv[];
{
int c,opt,x = 0,xcnt = 0,size = 0;
printf("\n\tTLPatch - translator.library patch utility V1.0\n");
printf("\t Richard Sheppard - 1991\n\n");
while(--argc > 0)
if((*++argv)[0] == '-') /* parse command line arguments */
{
while(opt = *++argv[0])
switch(opt)
{
case 'x':
case 'X':
Extract();
exit(0);
break;
default:
break;
}
}
if((fp1 = fopen("ram:except.tbl","r")) == NULL)
{
printf("*** Can't open ram:except.tbl\n");
printf("--- Copy your except.tbl to ram: or\n");
printf("--- use \"%s -x\" to extract table.\n",*argv);
exit(0);
}
else if((fp2 = fopen("ram:xtable.new","w")) == NULL)
{
printf("*** Can't open ram:xtable.new\n");
fclose(fp1);
exit(0);
}
else if((fp3 = fopen("sys:libs/translator.library","rb")) == NULL)
{
printf("*** Can't open sys:libs/translator.library\n");
fclose(fp2);
fclose(fp1);
exit(0);
}
if(!(ExecBase = (struct ExecBase *)OpenLibrary("exec.library", 0L)))
printf("*** Can't open ExecBase\n");
else
if((node = (struct Node *)FindName(&ExecBase->LibList,"translator.library")) != 0)
{
printf("\tRemoving resident translator.library\n");
Remove(node);
}
printf("\tReading exception table ...\n");
while((c = GetLine(line,256)) > 0)
{
size = size + c;
if(StrIndex(line, pattern) >= 0)
{
jmptab[x] = (LONG)(size - c + 112); /* 112 = table size */
x++;
pattern[1]++; /* increment search character */
if(pattern[1] == 91)
pattern[1] = 48; /* "0" - start of numbers */
if(pattern[1] == 49)
pattern[1] = 32; /* " " - start of punctuation */
if(pattern[1] == 33)
pattern[0] = 0; /* NULL */
}
fprintf(fp2,"%s",line); /* write new xtable */
xcnt++; /* exception count */
}
fputc('\0',fp2); /* NULL at end of exception table */
size++; /* size + NULL */
if((size + 2) % 4)
{
for(x = ((size + 2) % 4);x < 4;x++)
{
fputc('\0',fp2); /* align table to WORD boundary */
size++;
}
}
codesize = (size + 2014) / 4; /* 2014 = code + jmptab */
fclose(fp2);
fclose(fp1);
printf("\tReading original code ...\n");
Validate();
fclose(fp3);
if(codesize < 65536)
{
code[10] = 0x0000; /* patch hunk size */
code[11] = (WORD)codesize;
}
else
{
code[10] = (WORD)codesize / 65535; /* patch hunk size */
code[11] = (WORD)codesize % 65535;
}
code[16] = code[10]; /* 2nd copy of hunk size */
code[17] = code[11];
if((fp1 = fopen("ram:translator.library","wb")) == NULL)
{
printf("*** Can't create ram:translator.library\n");
exit(0);
}
fwrite((char *)&code,2,969,fp1); /* write 969 words */
fwrite((char *)&jmptab,2,56,fp1); /* write new jump table */
AddFile(); /* append new xtable */
fwrite((char *)&reloc,2,76,fp1); /* write reloc table */
fclose(fp1);
remove("ram:xtable.new");
printf("\n\tThe new translator.library is now in ram:\n");
printf("\t\t\t%d exceptions\n\n",xcnt);
if(ExecBase)
CloseLibrary(ExecBase);
exit(0);
}
int
GetLine(char s[], int lim)
{
int c, i;
i = 0;
while(--lim > 0 && (c=fgetc(fp1)) != EOF && c != '\n')
s[i++] = c;
s[i] = '\0';
return i;
}
int
GetExcept(char s[], int lim)
{
int c, i;
i = 0;
while(--lim > 0 && (c=fgetc(fp3)) != EOF && c != '\\' && c != '`')
s[i++] = c;
if(c == '\\' || c == '`')
s[i++] = c;
s[i] = '\0';
return i;
}
int
StrIndex(char s[], char t[])
{
int i;
for(i = 0;s[i] != '\0';i++)
{
if(s[i] == t[0] && s[i+1] == t[1])
return i;
}
return -1;
}
void
AddFile()
{
int c;
if((fp2 = fopen("ram:xtable.new","r")) == NULL)
{
printf("*** Can't re-open ram:xtable.new\n");
fclose(fp1);
exit(0);
}
while((c = getc(fp2)) != EOF)
putc(c,fp1);
fclose(fp2);
return;
}
void
Validate()
{
int x;
fread((char *)&code,2,969,fp3); /* read 969 words */
if(code[151] != 0x2033 || code[152] != 0x332E || code[153] != 0x3220)
{
printf("*** WARNING - not V33.2, unpredictable results could occur!\n");
for(x=0;x<3;x++)
printf("%04x ",code[151+x]);
printf("\n");
}
return;
}
void
Extract()
{
int c;
printf("\tExtracting exception table ...\n");
if((fp1 = fopen("ram:except.tbl","w")) == NULL)
{
printf("*** Can't create ram:except.tbl\n");
exit(0);
}
else if((fp3 = fopen("sys:libs/translator.library","rb")) == NULL)
{
printf("*** Can't open sys:libs/translator.library\n");
fclose(fp1);
exit(0);
}
Validate();
fread((char *)&code,2,56,fp3); /* read jump table */
while((c = GetExcept(line,256)) > 0)
{
fprintf(fp1,"%s",line);
if(line[1] != '\\' && line[1] != '`')
fprintf(fp1,"\n");
}
fclose(fp3);
fclose(fp1);
printf("\n\tThe exception table (except.tbl) is now in ram:\n\n");
return;
}
/* end of TLPatch.c */